#include "NodeFactory.h"
#include "Node.h"

/*
===============================================================================
 Name        : NodeFactory.cpp
 Author      : Bram en Paul
 Version     : 0.1
 Description : OOPatronen
===============================================================================
*/

//Statische zooi moet je buiten de klassedeclaratie definiëren.
//map<string, Node*> NodeFactory::nodeTypes;


/**
 * Constructor
 */
NodeFactory::NodeFactory()
{
	
}

NodeFactory::NodeMap& NodeFactory::getMap()
{
	static NodeMap  cNode;
	return cNode;
}


/**
 * Voegt een type+object combinatie toe aan de lijst. 
 * Als elke Nodesoort zich statisch aanmeldt bij deze lijst, kan deze klasse dus alle Nodesoorten identificeren.
 */
void NodeFactory::assignNode(string ID, Node* node)
{
	NodeMap&  cMap = getMap();
	cMap.insert(std::pair<string, Node*>(ID, node));
}


/**
 * Returnt een object op basis van het meegegeven type.
 */
Node* NodeFactory::createNode(string ID)
{
	//Zoek ID en Node paar
	NodeMap&  cMap = getMap();
	std::map<string, Node*>::iterator temp = cMap.find(ID);
	
	//Gevonden?
	if (temp == cMap.end())  {
		cout << "Unknown Node type: " << ID << "\n";
		return NULL;
	}
	
	Node* found = temp->second;
	//Roep de clone methode aan van het gevonden object.
	Node* created = found->clone();
	
	return created;
}


/**
 * Destructor
 */
NodeFactory::~NodeFactory()
{
	
}
